#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=110;
int N,inp[maxn],level[maxn];
int t=0;
vector<int> ans;
struct node{
    int data;
    int lchild=-1;
    int rchild=-1;
}Node[maxn];

void levelorder(int root){
    queue<int> que;
    while(!que.empty())que.pop();
    que.push(root);
    int tmp;
    while(!que.empty()){
        tmp=que.front();que.pop();
        ans.push_back(Node[tmp].data);
        if(Node[tmp].lchild!=-1){que.push(Node[tmp].lchild);}
        if(Node[tmp].rchild!=-1){que.push(Node[tmp].rchild);}
    }
}

void inorder(int root){
    if(Node[root].lchild!=-1){inorder(Node[root].lchild);}
    Node[root].data=inp[t++];
    if(Node[root].rchild!=-1){inorder(Node[root].rchild);}
}


int main(){
    //freopen("in.txt","r",stdin);
    scanf("%d",&N);
    int u,v;
    for(int i=0;i<N;i++){
        scanf("%d %d",&u,&v);
        if(u!=-1){Node[i].lchild=u;}
        if(v!=-1){Node[i].rchild=v;}
    }
    for(int i=0;i<N;i++){
        scanf("%d",&inp[i]);
    }
    sort(inp,inp+N);
    inorder(0);
    levelorder(0);
    for(int i=0;i<ans.size();i++){
        if(i==0) printf("%d",ans[i]);
        else printf(" %d",ans[i]);
    }
}
